export default {
	// 为当前模块开启命名空间
	namespaced: true,
	// 模块的 state 数据
	state: () => ({
		// 购物车数组，用来存储购物车中每个商品的信息
		cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
	}),
	// 模块的 mutations 方法
	mutations: {
		saveToStorage(state) {
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},
		// #1 准备一个加入购物车的方法
		addToCart(state, goods) {
			// 如果说 goods.goods_id 在 state.cart 中能找到，只需要把找到的这个对象 goods_count + 1
			const item = state.cart.find(item => item.goods_id === goods.goods_id)
			if (item) {
				item.goods_count += 1
			} else {
				// 如果没找到，直接 push 到 state.cart
				state.cart.push(goods)
			}
			// 持久化到本地
			this.commit('m_cart/saveToStorage')
		},
		// #4 定义修改状态的 mutation
		updateGoodsState(state, goods) {
			const res = state.cart.find(item => item.goods_id === goods.goods_id)
			if (res) {
				// 修改 vuex 中的数据
				res.goods_state = goods.goods_state
				// 并把修改后的结果同步到本地
				this.commit('m_cart/saveToStorage')
			}
		},
		// #5 准备对应的修改状态的方法
		updateGoodsCount(state, goods) {
			const res = state.cart.find(item => item.goods_id === goods.goods_id)
			if (res) {
				// 修改 vuex 中的数据
				res.goods_count = goods.goods_count
				// 并把修改后的结果同步到本地
				this.commit('m_cart/saveToStorage')
			}
		},
		deleteGoods(state, goods) {
			state.cart = state.cart.filter(item => item.goods_id !== goods.goods_id)
			// 并把修改后的结果同步到本地
			this.commit('m_cart/saveToStorage')
		},
		// 点击全选修改每一个单选
		updateAllGoodsState(state, goodState) {
			state.cart.forEach(item => item.goods_state = goodState)
			// 并把修改后的结果同步到本地
			this.commit('m_cart/saveToStorage')
		}
	},
	// 模块的 getters 属性
	getters: {
		// #1 全局的计算属性，计算数量
		total(state) {
			return state.cart.reduce((acc, cur) => acc + cur.goods_count, 0)
		},
		checkedCount(state) {
			// 选中的数量
			// 先找选中的 => 在同一每一个的 goods_count
			return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count, 0)
		},
		// 选中的价钱
		checkedGoodsAmount(state) {
			return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count * cur
				.goods_price,
				0)
		}
	},
}
